/*******************************************************************************
* 文 件 名         : usartHelper.c
* 文件功能		     : 串口发送工具函数
* 作    者         : OnenJl 
* 时    间         : 2024/03/20
*******************************************************************************/ 
#include "usartHelper.h" 
#include "usart.h"

/*******************************************************************************
* 函 数 名         : sendDatas
* 函数功能		     : 发送数据-数组
* 输    入         : usart 
*                    len    数组长度
*                    data   数据数组
* 输    出         : 无
*******************************************************************************/ 
void sendDatas(USART_TypeDef * usart,u16 len, u8 data[])
{ 
	u16 t=0; 
	for(t=0;t<len;t++)
	{
		USART_SendData(USART1, data[t]);         																					//向串口1发送数据
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);														//等待发送结束
	} 
}
/*******************************************************************************
* 函 数 名         : sendString
* 函数功能		     : 发送字符串
* 输    入         : usart  
*                    data   数据数组
* 输    出         : 无
*******************************************************************************/ 
void sendString(USART_TypeDef * usart, char* data)
{ 
	int i = 0; 
  while (data[i] != '\0') {
		USART_SendData(USART1, data[i]);         																					//向串口1发送数据
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);															//等待发送结束
		i++;
	} 
}

 
/*******************************************************************************
* 函 数 名           : dataPackage
* 函数功能		       : 数据封包 
* 输    入           : 
* addrId;            : 地址域，设备ID
* u8 ctrlId;         : 控制域，控制指令
* u8 countId;        : 帧号
* u8 countIdS;       : 总帧长度
* len                : 数组长度
* data               : 数据数组
* 输    出           : 无
*******************************************************************************/  
void dataPackage(u8 len,u8 data[],u8 addrId, u8 ctrlId,u8 countId, u8 countIdS)
{  
	 u8 lenN = len + 12;
	 u8 i;
	 u8 dataN[lenN]        ;
	 int checkSum=0         ;
	 USART_TypeDef * usart ;
	 
	// 封包=====================
	dataN[0] = 0xAA        ; 
	dataN[1] = 0xBB        ;
	dataN[2] = addrId      ;
	dataN[3] = ctrlId      ;
	dataN[4] = countId >> 8;       // 帧号 注意大小端
	dataN[5] = countId & 0xFF;
	dataN[6] = len;
 
	// 封装目标数据 
	 for(i = 0 ; i < len ; i++)
	 {
		  dataN[i + 7] = data[i];
	 } 
	 dataN[lenN - 5] = countIdS >> 8;                // 总帧长 注意大小端
	 dataN[lenN - 4] = countIdS & 0xFF; 
	 
	// 计算校验和 
	for(i=0;i<lenN-3;i++)
	 {
		  checkSum = (checkSum + dataN[i]);
	 }
	 checkSum = checkSum % 0xff;
	
	dataN[lenN - 3] = checkSum;  // 校验和 
	dataN[lenN - 2] = 0xCC;     // 帧尾
	dataN[lenN - 1] = 0xDD;
	
	
	
	if(addrId == 1)
	{
		usart = USART1;
	}
	if(addrId == 2)
	{
		usart = USART2;
	}
	// 数据发送
	sendDatas(usart, lenN, dataN); 
}	 


int string_length(const char* str) {
    int length = 0;
    while (str[length] != '\0') {
        length++;
    }
    return length;
}

